`include "common_defines.v"
`define ADDR_W 32
`define PADDR_W 32
`define VADDR_W 32
// 测试的程序使用bin文件 主要影响axi_ram中内容
/* BOOT mode */
`define BOOT_ROM  2'd0
`define BOOT_SD   2'd1
`define BOOT_MEM  2'd3
// cpu 启动模式 
// TODO : ASIC\FPGA 只能是BOOTROM启动
`define BOOT_MODE `BOOT_ROM
/* BOOT address */
`define BOOT_ROM_START `VADDR_W'h3000_0000
`define BOOT_SD_START  `VADDR_W'h4000_0000
`define BOOT_MEM_START `VADDR_W'h8000_0000

// 分支预测启用
// `define PREDICT_PC 

`define XLEN 64
`define ZERO 'd0

`define Y  1'b1
`define N  1'b0

`define FU_W    4
`define OP_W    4

`define SRC_XX  2'd0
`define SRC_RF  2'd1
`define SRC_OR  2'd2
`define SRC_IM  2'd2
`define SRC_PC  2'd2

`define FU_ALU  `FU_W'd1
`define FU_BRU  `FU_W'd2
`define FU_LSU  `FU_W'd3
`define FU_CSR  `FU_W'd4
`define FU_ALUW `FU_W'd5
`define FU_XXX  `FU_W'd0

`define ALU_ADD   `OP_W'd1
`define ALU_SUB   `OP_W'd2
`define ALU_SLL   `OP_W'd3
`define ALU_SRL   `OP_W'd4
`define ALU_SRA   `OP_W'd5
`define ALU_AND   `OP_W'd6
`define ALU_OR    `OP_W'd7
`define ALU_XOR   `OP_W'd8
`define ALU_SLT   `OP_W'd9
`define ALU_SLTU  `OP_W'd10
`define ALU_XXXX  `OP_W'd0

`define BRU_JAL   `OP_W'h1
`define BRU_JALR  `OP_W'h2
`define BRU_BEQ   `OP_W'h3
`define BRU_BNE   `OP_W'h4
`define BRU_BGE   `OP_W'h5
`define BRU_BGEU  `OP_W'h6
`define BRU_BLT   `OP_W'h7
`define BRU_BLTU  `OP_W'h8
`define BRU_X     `OP_W'h0

// Memory Mask Type Signal 
// LDU is illegal
`define LSU_RBS  `OP_W'b0000
`define LSU_RHS  `OP_W'b0010
`define LSU_RWS  `OP_W'b0100
`define LSU_RDX  `OP_W'b0110 
`define LSU_RBU  `OP_W'b0001
`define LSU_RHU  `OP_W'b0011
`define LSU_RWU  `OP_W'b0101
`define LSU_WBX  `OP_W'b1000
`define LSU_WHX  `OP_W'b1010
`define LSU_WWX  `OP_W'b1100
`define LSU_WDX  `OP_W'b1110 
`define LSU_XXX  `OP_W'b1111
`define LSU_FEI  `OP_W'b0111
// CSR 
`define CSR_W  `OP_W'd1 // W   bits
`define CSR_S  `OP_W'd2 // Set bits
`define CSR_C  `OP_W'd3 // Clr bits
`define CSR_P  `OP_W'd4 // 特权级操作
`define CSR_X  `OP_W'd0 // 非CSR操作

// 立即数类型
`define IMM_X   3'd0
`define IMM_I   3'd1 // CUL 
`define IMM_S   3'd2 // store
`define IMM_B   3'd3 // b
`define IMM_U   3'd4 // u
`define IMM_J   3'd5 // jal
`define IMM_R   3'd7 // csr

// 特权级
`define PRV_U  2'd0
`define PRV_S  2'd1
`define PRV_H  2'd2
`define PRV_M  2'd3

`define EXCEPT 16
`define ecall   0
`define mret    1
`define sret    2
`define uret    3
`define ebreak  4
`define clint   5
`define ilginst 6
`define fencei  7
